﻿using System;
using System.Globalization;
using EntidadesFacturacion;

namespace FuncionesUtilitarias
{
    public class CalculosNumericosAlgoritmos
    {
        #region Metodos de calculo

        /// <summary>
        /// Funcion para calcular el el validador con el algoritmo del modulo 11.
        /// </summary>
        /// <param name="number">numero</param>
        /// <returns></returns>
        public string Mod11AgregarVerificador(string number)
        {
            int sum = 0;
            for (int i = number.Length - 1, multiplier = 2; i >= 0; i--)
            {
                sum += (int)char.GetNumericValue(number[i]) * multiplier;
                if (++multiplier == 8) multiplier = 2;
            }
            string validator = (11 - (sum % 11)).ToString(CultureInfo.InvariantCulture);
            if (validator == "11") validator = "0";
            else if (validator == "10") validator = "X";

            return number + validator;
        }
        #endregion

        #region Metodos de generacion

        /// <summary>
        /// Funcion para la creacion de la clave de acceso de un documento tributario.
        /// </summary>
        /// <param name="empresa">Empresa que emite el documento</param>
        /// <param name="tipoComprobante">el tipo de documento ejm FACTURA</param>
        /// <param name="tipoAmbiente">pruebas o produccion</param>
        /// <param name="documento">informacion tributaria del documento en si  </param>
        /// <param name="codigo">un secuencial interno de la empresa</param>
        /// <param name="tipoEmision">si es normal o de contingencia</param>
        /// <returns></returns>
        public string GeneraClaveAcceso(Empresa empresa, string tipoComprobante, int tipoAmbiente, Documento documento, int codigo, int tipoEmision)
        {
            var fechaEmision = DateTime.Now.Day.ToString().PadLeft(2, '0') +
                               DateTime.Now.Month.ToString().PadLeft(2, '0') + DateTime.Now.Year.ToString();
            var ruc = empresa.Identificacion;
            var codigoNumero = codigo.ToString().PadLeft(8, '0');
            var serie = documento.Establecimiento + documento.PuntoEmision;
            var comprobante = documento.Secuencial;
            var claveAcceso = fechaEmision + tipoComprobante + ruc + tipoAmbiente.ToString() + serie + comprobante +
                              codigoNumero + tipoEmision.ToString();
            return Mod11AgregarVerificador(claveAcceso);
        }

        /// <summary>
        /// Funcion para la creacion de la clave de acceso de un documento tributario en modo de contingencia.
        /// </summary>
        /// <param name="contingencia">los codigos de contingencia que nos adminstra el sri</param>
        /// <param name="tipoComprobante">el tipo de documento ejm FACTURA</param>
        /// <param name="tipoEmision">si es normal o de contingencia</param>
        /// <returns></returns>
        public string GeneraClaveAccesoContingencia(ClaveContingencia contingencia, string tipoComprobante, int tipoEmision)
        {
            var fechaEmision = DateTime.Now.Day.ToString().PadLeft(2, '0') +
                               DateTime.Now.Month.ToString().PadLeft(2, '0') + DateTime.Now.Year.ToString();
            var claveAcceso = fechaEmision + tipoComprobante + contingencia.SecuencialContingencia + tipoEmision.ToString();
            return Mod11AgregarVerificador(claveAcceso);
        }

        /// <summary>
        /// Genera xml de un objeto complejo o documento tributario.
        /// </summary>
        /// <param name="facturaObj">Objeto complejo del tipo de comprobante.</param>
        /// <returns></returns>
        public string GeneraXmlFactura(factura facturaObj)
        {
            return Serializaciones.SerializeXml(facturaObj);
        }
        #endregion
    }
}
